﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using QuanLyHocPhi.GUI.DuLieu;
using QuanLyHocPhi.Model;
using QuanLyHocPhi.BLL;

namespace QuanLyHocPhi.GUI.TacNghiep
{
    public partial class UcLopHocPhan_DanhSachSinhVien : QuanLyHocPhi.GUI.BaseForm.UserControlBase
    {
        #region Thuộc tính
        [Browsable(false)]
        public bool IsChuyen { get; set; }
        private string fileName = "";
        private LopHocPhan m_LopHocPhan = null;
        [Browsable(false)]
        public LopHocPhan LopHocPhan
        {
            get { return m_LopHocPhan; }
            set
            {
                m_LopHocPhan = value;
                HienThiThongTinChiTietLopHocPhan();
            }
        }

        [Browsable(false)]
        public Truong Truong { get; set; }

        private void HienThiThongTinChiTietLopHocPhan()
        {
            var lopHocPhan = this.LopHocPhan;
            if (lopHocPhan == null)
            {
                panelLopHocPhan_DanhSachSinhVien.Enabled = false;
                lblLopHocPhan_TenLop.Text = "Lớp học phần: ";
                lblLopHocPhan_ThoiGianHoc.Text = "Thời gian học: ";
                lblLopHocPhan_GiangVien.Text = "Giáo viên phụ trách: ";
                lblLopHocPhan_HocPhi.Text = "Học phí: ";
                bsSinhVien.DataSource = null;
            }
            else
            {
                panelLopHocPhan_DanhSachSinhVien.Enabled = true;
                lblLopHocPhan_TenLop.Text = "Lớp học phần: " + lopHocPhan.TenLopHocPhan;
                lblLopHocPhan_ThoiGianHoc.Text = string.Format("Thời gian học: {0} ÷ {1}",
                    CommonUtils.StringOf(lopHocPhan.NgayBatDau),
                    CommonUtils.StringOf(lopHocPhan.NgayKetThuc));
                lblLopHocPhan_GiangVien.Text = "Giáo viên phụ trách: " + lopHocPhan.GiaoVienPhuTrach;
                lblLopHocPhan_HocPhi.Text = "Học phí: " + CommonUtils.StringOf(lopHocPhan.HocPhiThucTe);
                bsSinhVien.DataSource = BizLopHocPhan.GetList_SinhVienFullDetails(lopHocPhan);
            }

            gridSinhVien.ReadOnly = true;
            gridSinhVien.AllowUserToAddRows = false;
            gridSinhVien.AllowUserToDeleteRows = false;
            gridSinhVien.AutoGenerateColumns = false;
            colSinhVien_MaSinhVien.DataPropertyName = "MaSinhVien";
            colSinhVien_HeSoMienGiam.DataPropertyName = "HeSoMienGiam";
            colSinhVien_MaPhieuThu.DataPropertyName = "MaPhieuThu";
            gridSinhVien.DataSource = bsSinhVien;

            lblThongKe.Text = (lopHocPhan == null) ? "" : string.Format("Danh sách có {0} sinh viên", bsSinhVien.Count);
        }
        #endregion

        /// <summary>
        /// Điều khiển thể hiện danh sách sinh viên có trong lớp học phần cho trước
        /// </summary>
        public UcLopHocPhan_DanhSachSinhVien()
        {
            InitializeComponent();
            fileName = string.Format("{0}\\TEMPLATES\\MauDanhSachSinhVienTrongLopHocPhan.xls",
                Application.StartupPath);
        }

        private void OnSinhVien_ReloadClick(object sender, EventArgs e)
        {
            HienThiThongTinChiTietLopHocPhan();
        }

        private void OnSinhVien_SuaDangKyLHPClick(object sender, EventArgs e)
        {
            LopHocPhan_SinhVien thongTinDangKy = null;
            if (bsSinhVien.Current != null)
                thongTinDangKy = bsSinhVien.Current as LopHocPhan_SinhVien;
            if (thongTinDangKy == null)
            {
                DialogUtils.ShowMessage("Bạn phải chọn một mục thông tin để chỉnh sửa!");
                return;
            }

            FormThongTinDangKy_Details frm = new FormThongTinDangKy_Details(isAdding: false,
                thongTinDangKy: thongTinDangKy);
            if (frm.ShowDialog() == DialogResult.OK)
                HienThiThongTinChiTietLopHocPhan();

        }

        private void OnSinhVien_DeleteClick(object sender, EventArgs e)
        {
            LopHocPhan_SinhVien thongTinDangKy = null;
            if (bsSinhVien.Current != null)
                thongTinDangKy = bsSinhVien.Current as LopHocPhan_SinhVien;
            if (thongTinDangKy == null)
            {
                DialogUtils.ShowMessage("Bạn phải chọn một sinh viên để chỉnh sửa thông tin!");
                return;
            }
            string maSinhVien = thongTinDangKy.MaSinhVien;


            try
            {
                BizLopHocPhan.Delete_ThongTinDangKyLopHocPhan(m_LopHocPhan, maSinhVien);
                HienThiThongTinChiTietLopHocPhan();
            }
            catch (Exception exc)
            {
                DialogUtils.ShowError(exc.Message);
            }
        }

        private void OnGridSinhVienDataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            // Nạp thông tin cho những cột không được bind
            foreach (DataGridViewRow row in gridSinhVien.Rows)
            {
                LopHocPhan_SinhVien thongTinDangKy = row.DataBoundItem as LopHocPhan_SinhVien;
                if (thongTinDangKy == null)
                    continue;
                SinhVien sv = thongTinDangKy.SinhVien;
                if (sv != null)
                {
                    row.Cells[colSinhVien_HoDem.Index].Value = sv.HoDem;
                    row.Cells[colSinhVien_Ten.Index].Value = sv.Ten;
                    row.Cells[colSinhVien_NgaySinh.Index].Value = sv.NgaySinh;
                    row.Cells[colSinhVien_MaLop.Index].Value = sv.KC_MaLop;
                    row.Cells[colSinhVien_TenLop.Index].Value = sv.Lop.TenLop;
                    row.Cells[colSinhVien_DaNopHocPhi.Index].Value = !thongTinDangKy.MaPhieuThu.IsNullOrEmpty();
                }
            }
        }

        private void OnBsSinhVienCurrentChanged(object sender, EventArgs e)
        {
            LopHocPhan_SinhVien thongTinDangKy = null;
            if (bsSinhVien.Current != null)
                thongTinDangKy = bsSinhVien.Current as LopHocPhan_SinhVien;
            //if (thongTinDangKy != null)
            //{
            //    btnSinhVien_SuaDangKy.Enabled = btnSinhVien_Delete.Enabled = thongTinDangKy.MaPhieuThu.IsNullOrEmpty();
            //}
        }

        private void OnGridSinhVienCellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex < 0)
                return;

            LopHocPhan_SinhVien thongTinDangKy = null;
            if (bsSinhVien.Current != null)
                thongTinDangKy = bsSinhVien.Current as LopHocPhan_SinhVien;
            if (thongTinDangKy != null)
            {
                //btnSinhVien_Edit.PerformClick();
                if (string.IsNullOrEmpty(thongTinDangKy.MaPhieuThu))
                {
                    //Tạo mới phiếu thu
                    string maSinhVien = thongTinDangKy.MaSinhVien;
                    SinhVien sinhVien = BizSinhVien.GetSinhVienByMaSinhVien(maSinhVien);
                    if (sinhVien != null)
                    {
                        ChiTietPhieuThu frmPT = new ChiTietPhieuThu(sinhVien, thongTinDangKy.MaLopHocPhan);
                        frmPT.ShowDialog();
                    }
                }
                else
                {
                    //Chỉnh sửa phiếu thu
                    PhieuThu pt = BizPhieuThu.GetPhieuThu(thongTinDangKy.MaPhieuThu);
                    if (pt != null)
                    {
                        ChiTietPhieuThu frmPT = new ChiTietPhieuThu(pt);
                        frmPT.ShowDialog();
                    }
                }
            }
        }

        private void OnSinhVien_AddClick(object sender, EventArgs e)
        {
            //LopHocPhan_SinhVien thongTinDangKy = new LopHocPhan_SinhVien
            //{
            //    MaLopHocPhan = this.LopHocPhan.MaLopHocPhan,
            //    MaSinhVien = null
            //};

            //TacNghiep.FormThongTinDangKy_Details frm = new FormThongTinDangKy_Details(
            //    isAdding: true, thongTinDangKy: thongTinDangKy
            //    );
            //if (frm.ShowDialog() == DialogResult.OK)
            //{
            //    btnSinhVien_Reload.PerformClick();
            //}
            SelectDSSinhVienDialog ds = null;
            if (IsChuyen)
                ds = new SelectDSSinhVienDialog(this.LopHocPhan, true);
            else
                ds = new SelectDSSinhVienDialog(this.LopHocPhan, false);
            ds.ShowDialog();
        }

        private void btnSinhVien_In_Click(object sender, EventArgs e)
        {
            #region Tiền xử lý
            if (!File.Exists(fileName))
            {
                MessageBox.Show("File mẫu MauThongKeChuaNop.xls không tồn tại", "Lỗi");
                return;
            }
            FileStream fs = null;
            try
            {
                fs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            }
            catch (Exception)
            {
                MessageBox.Show("File mẫu đang mở. Vui lòng đóng lại trước khi tiếp tục", "Lỗi");
                return;
            }
            #endregion

            var danhSachSinhVien = (IList<LopHocPhan_SinhVien>)bsSinhVien.DataSource;
            var tenTruong = string.Format("Trường: {0}.", this.Truong != null ? this.Truong.TenTruong : "_");
            var lopHocPhan = string.Format(" Nhóm: {0}", this.LopHocPhan != null ? this.LopHocPhan.TenLopHocPhan : "_");
            #region Làm việc với file excel
            FormProgress frm = new FormProgress();
            frm.DoWork += delegate(object oSender, DoWorkEventArgs oE)
            {
                HSSFWorkbook templateWorkbook = new HSSFWorkbook(fs, true);

                #region Tạo style cho phần hiển thị tên trường, tên khóa
                var titleCellStyle = templateWorkbook.CreateCellStyle();
                titleCellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
                var titleFont = templateWorkbook.CreateFont();
                titleFont.Boldweight = (short)FontBoldWeight.BOLD;
                titleFont.FontHeight = 236;
                titleFont.FontName = "Times New Roman";
                titleCellStyle.SetFont(titleFont);
                #endregion

                #region Tạo các style cho phần hiển thị nội dung
                var detailCellStyle = templateWorkbook.CreateCellStyle();
                detailCellStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
                detailCellStyle.BorderBottom = CellBorderType.DASHED;
                detailCellStyle.BorderLeft = CellBorderType.THIN;
                detailCellStyle.BorderRight = CellBorderType.THIN;
                var cellHoStyle = templateWorkbook.CreateCellStyle();
                cellHoStyle.BorderBottom = CellBorderType.DASHED;
                cellHoStyle.BorderLeft = CellBorderType.THIN;
                var cellTenStyle = templateWorkbook.CreateCellStyle();
                cellTenStyle.BorderBottom = CellBorderType.DASHED;
                cellTenStyle.BorderRight = CellBorderType.THIN;

                var detailCellStyleEnd = templateWorkbook.CreateCellStyle();
                detailCellStyleEnd.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
                detailCellStyleEnd.BorderBottom = CellBorderType.THIN;
                detailCellStyleEnd.BorderLeft = CellBorderType.THIN;
                detailCellStyleEnd.BorderRight = CellBorderType.THIN;
                var cellHoStyleEnd = templateWorkbook.CreateCellStyle();
                cellHoStyleEnd.BorderBottom = CellBorderType.THIN;
                cellHoStyleEnd.BorderLeft = CellBorderType.THIN;
                var cellTenStyleEnd = templateWorkbook.CreateCellStyle();
                cellTenStyleEnd.BorderBottom = CellBorderType.THIN;
                cellTenStyleEnd.BorderRight = CellBorderType.THIN;

                var cellTongSoStyle = templateWorkbook.CreateCellStyle();
                var fontCellTongSo = templateWorkbook.CreateFont();
                fontCellTongSo.IsItalic = true;
                cellTongSoStyle.SetFont(fontCellTongSo);
                var cellBottomStyle = templateWorkbook.CreateCellStyle();
                cellBottomStyle.Alignment = NPOI.SS.UserModel.HorizontalAlignment.CENTER;
                var fontCellBottomStyle = templateWorkbook.CreateFont();
                fontCellBottomStyle.Boldweight = (short)FontBoldWeight.BOLD;
                cellBottomStyle.SetFont(fontCellBottomStyle);
                #endregion

                #region Khởi tạo
                var sheet = templateWorkbook.GetSheet("sheet1");
                var indexRow = 5;
                var soLuongSinhVien = danhSachSinhVien.Count;
                var row = sheet.CreateRow(3);
                #endregion

                #region Chèn phần tên trường và tên khóa
                var cell = row.CreateCell(0);
                cell.SetCellValue(tenTruong + lopHocPhan);
                cell.CellStyle = titleCellStyle;
                #endregion

                #region Chèn nội dung danh sách sinh viên
                for (int j = 0; j < soLuongSinhVien; j++)
                {
                    var dtRow = danhSachSinhVien[j];
                    int i = j + 6;
                    row = sheet.CreateRow(i);

                    #region Số thứ tự
                    cell = row.CreateCell(0);
                    cell.SetCellValue((j + 1).ToString());
                    cell.CellStyle = (j == (soLuongSinhVien - 1)) ? detailCellStyleEnd : detailCellStyle;
                    #endregion

                    #region Mã sinh viên
                    cell = row.CreateCell(1);
                    cell.SetCellValue(dtRow.MaSinhVien != null ? dtRow.MaSinhVien.ToString() : "");
                    cell.CellStyle = (j == (soLuongSinhVien - 1)) ? detailCellStyleEnd : detailCellStyle;
                    #endregion

                    #region Họ
                    cell = row.CreateCell(2);
                    cell.SetCellValue(dtRow.SinhVien.HoDem != null ? dtRow.SinhVien.HoDem.ToString() : "");
                    cell.CellStyle = (j == (soLuongSinhVien - 1)) ? cellHoStyleEnd : cellHoStyle;
                    #endregion

                    #region Tên
                    cell = row.CreateCell(3);
                    cell.SetCellValue(dtRow.SinhVien.Ten != null ? dtRow.SinhVien.Ten.ToString() : "");
                    cell.CellStyle = (j == (soLuongSinhVien - 1)) ? cellTenStyleEnd : cellTenStyle;
                    #endregion

                    #region Ngày sinh
                    cell = row.CreateCell(4);
                    string ns = dtRow.SinhVien.NgaySinh != null ? dtRow.SinhVien.NgaySinh.Split(new char[] { ' ' }, StringSplitOptions.None)[0] : "";
                    cell.SetCellValue(ns);
                    cell.CellStyle = (j == (soLuongSinhVien - 1)) ? detailCellStyleEnd : detailCellStyle;
                    #endregion

                    #region Lớp gốc
                    cell = row.CreateCell(5);
                    cell.SetCellValue(dtRow.SinhVien.Lop.TenLop != null ? dtRow.SinhVien.Lop.TenLop.ToString() : "");
                    cell.CellStyle = (j == (soLuongSinhVien - 1)) ? detailCellStyleEnd : detailCellStyle;
                    #endregion

                    #region Số tiền

                    decimal soTien = 0;
                    if (string.IsNullOrEmpty(dtRow.MaPhieuThu))
                    {
                        LopHocPhan lhp = BizLopHocPhan.GetLopHocPhanByMaLHP(dtRow.MaLopHocPhan);
                        soTien = lhp.HocPhi + lhp.PhuThu;
                        soTien = soTien - soTien * (decimal)dtRow.HeSoMienGiam;
                        soTien = Math.Round(soTien, 0);
                    }
                    else
                    {
                        PhieuThu pt = BizPhieuThu.GetPhieuThu(dtRow.MaPhieuThu);
                        if (pt != null)
                            soTien = pt.SoTien;
                    }
                    cell = row.CreateCell(6);
                    cell.SetCellValue(soTien.ToString());
                    cell.CellStyle = (j == (soLuongSinhVien - 1)) ? detailCellStyleEnd : detailCellStyle;
                    #endregion

                    #region Ký nộp
                    cell = row.CreateCell(7);
                    if (string.IsNullOrEmpty(dtRow.MaPhieuThu))
                        cell.SetCellValue("");
                    else
                        cell.SetCellValue("Đã nộp");
                    cell.CellStyle = (j == (soLuongSinhVien - 1)) ? detailCellStyleEnd : detailCellStyle;
                    #endregion

                    #region Ghi chú
                    cell = row.CreateCell(8);
                    cell.SetCellValue("");
                    cell.CellStyle = (j == (soLuongSinhVien - 1)) ? detailCellStyleEnd : detailCellStyle;
                    #endregion

                    indexRow = i;
                }
                #endregion

                #region Tổng cộng
                indexRow += 1;
                row = sheet.CreateRow(indexRow);
                cell = row.CreateCell(0);
                cell.SetCellValue("");
                cell.CellStyle = detailCellStyleEnd;
                cell = row.CreateCell(1);
                cell.SetCellValue("");
                cell.CellStyle = detailCellStyleEnd;
                cell = row.CreateCell(2);
                cell.SetCellValue("Tổng cộng");
                cell.CellStyle = cellHoStyleEnd;
                cell = row.CreateCell(3);
                cell.SetCellValue("");
                cell.CellStyle = cellTenStyleEnd;
                cell = row.CreateCell(4);
                cell.SetCellValue("");
                cell.CellStyle = detailCellStyleEnd;
                cell = row.CreateCell(5);
                cell.SetCellValue("");
                cell.CellStyle = detailCellStyleEnd;
                cell = row.CreateCell(6);
                cell.SetCellValue("");
                cell.CellStyle = detailCellStyleEnd;
                cell = row.CreateCell(7);
                cell.SetCellValue("");
                cell.CellStyle = detailCellStyleEnd;
                cell = row.CreateCell(8);
                cell.SetCellValue("");
                cell.CellStyle = detailCellStyleEnd;
                #endregion

                #region Chèn phần bottom
                indexRow += 1;
                row = sheet.CreateRow(indexRow);
                cell = row.CreateCell(0);
                cell.SetCellValue(string.Format("Bằng chữ: ", soLuongSinhVien));
                cell.CellStyle = cellTongSoStyle;
                indexRow += 2;
                row = sheet.CreateRow(indexRow);
                cell = row.CreateCell(6);
                cell.SetCellValue("Huế, " + string.Format("{0:dd/MM/yyyy}", DateTime.Now).DateToText());
                cell.CellStyle = cellTongSoStyle;
                indexRow += 1;
                row = sheet.CreateRow(indexRow);
                cell = row.CreateCell(1);
                cell.SetCellValue("Thủ trưởng đơn vị");
                cell.CellStyle = cellBottomStyle;
                cell = row.CreateCell(4);
                cell.SetCellValue("Kế toán trưởng");
                cell.CellStyle = cellBottomStyle;
                cell = row.CreateCell(6);
                cell.SetCellValue("CB thu tiền");
                cell.CellStyle = cellBottomStyle;
                #endregion

                #region Lưu ra file Excel mới
                sheet.ForceFormulaRecalculation = true;
                var temp = (this.LopHocPhan != null ? this.LopHocPhan.TenLopHocPhan : "").Replace(",", "").Replace(".", "").Replace("\\", "").Replace("/", "").Replace(")", "_").Replace("(", "_");
                //var tenfile = string.Format("C:\\TheChat\\{0}_{1}.xls", this.Truong.TenTruong, temp);
                var tenfile = string.Format("{0}\\{1}_{2}.xls", Application.StartupPath, this.Truong.TenTruong, temp);
                try
                {
                    using (var fileData = new FileStream(tenfile, FileMode.Create))
                    {
                        templateWorkbook.Write(fileData);
                        fileData.Close();

                        #region Excel commented
                        //Mở file excel
                        //var xlApp = new Excel.Application();
                        //object misValue = System.Reflection.Missing.Value;
                        //var xlWorkBook = xlApp.Workbooks.Open(tenfile,
                        //                                      Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                        //                                      Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                        //                                      Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                        //                                      Type.Missing, Type.Missing);
                        //xlApp.Visible = true;
                        #endregion

                        System.Diagnostics.Process.Start(tenfile);
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception("Bạn đang mở file " + tenfile + ". Vui lòng đóng lại trước khi tiếp tục. " + ex.ToString());
                }
                fs.Close();
                #endregion
            };
            #endregion

            #region On complete
            frm.RunWorkerCompleted += delegate(object oSender, RunWorkerCompletedEventArgs oE)
            {
                if (oE.Error != null)
                {
                    string msg = oE.Error.Message;
                    if (oE.Error.InnerException != null)
                        msg += oE.Error.InnerException.Message;
                    DialogUtils.ShowError(msg);
                }

            };
            #endregion

            frm.StartWorking(this.ParentForm);
        }

        private void OnSinhVien_SuaThongTinGocClick(object sender, EventArgs e)
        {
            LopHocPhan_SinhVien thongTinDangKy = null;
            if (bsSinhVien.Current != null)
                thongTinDangKy = bsSinhVien.Current as LopHocPhan_SinhVien;
            if (thongTinDangKy == null)
            {
                DialogUtils.ShowMessage("Bạn phải chọn một sinh viên để chỉnh sửa thông tin!");
                return;
            }
            string maSinhVien = thongTinDangKy.MaSinhVien;
            SinhVien sinhVien = BizSinhVien.GetSinhVienByMaSinhVien(maSinhVien);
            if (sinhVien == null)
            {
                DialogUtils.ShowError("Sinh viên không còn tồn tại trên hệ thống!");
            }
            else
            {
                GUI.DuLieu.FormSinhVienKhongChuyen_Details frm = null;
                if (IsChuyen)
                    frm = new DuLieu.FormSinhVienKhongChuyen_Details(sinhVien, isAddingNew: false, chuyen: true);
                else
                    frm = new DuLieu.FormSinhVienKhongChuyen_Details(sinhVien, isAddingNew: false);
                if (frm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    HienThiThongTinChiTietLopHocPhan();
            }
        }
    }
}
